package edu.whu.demo.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import edu.whu.demo.dao.ProductDao;
import edu.whu.demo.domain.Product;
import edu.whu.demo.domain.ProductDTO;
import edu.whu.demo.domain.Supplier;
import edu.whu.demo.exception.ProductAdminException;
import edu.whu.demo.service.IProductService;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;

@Service // 声明这是一个服务类
public class ProductServiceImpl extends ServiceImpl<ProductDao, Product> implements IProductService {

    // 实现接口中的方法，用于查找产品
    @Override
    public IPage<ProductDTO> findProduct(Map<String, Object> condition, Integer pageNum, Integer pageSize) {
        Page<ProductDTO> page = new Page<>(pageNum, pageSize); // 创建分页对象
        QueryWrapper<ProductDTO> qw = new QueryWrapper<>(); // 创建查询条件包装器
        qw.like(condition.containsKey("name"), "p.name", condition.get("name")); // 根据名称模糊查询
        qw.le(condition.containsKey("price"), "p.price", condition.get("price")); // 价格小于等于指定值
        qw.ge(condition.containsKey("stockQuantity"), "p.stock_quantity", condition.get("stockQuantity")); // 库存数量大于等于指定值
        qw.eq(condition.containsKey("category"), "p.category", condition.get("category")); // 根据类别查询
        if(condition.containsKey("supplierName")){ // 如果存在供应商名称条件
            qw.eq("s.name", condition.get("supplierName")); // 添加供应商名称条件
            this.baseMapper.findProductsBySupplier(page, qw); // 多表查询
        }else{
            this.baseMapper.findProducts(page, qw); // 单表查询
        }
        return page; // 返回分页结果
    }

    // 实现接口中的方法，用于添加产品
    @Transactional
    @Override
    public Product addProduct(Product product) throws ProductAdminException {
        try {
            this.baseMapper.insert(product); // 插入产品数据
            return product; // 返回添加的产品
        }catch (Exception e) {
            throw new ProductAdminException("添加产品失败：" + e.getMessage()); // 抛出异常
        }
    }

    // 实现接口中的方法，用于更新产品
    @Transactional(rollbackFor = ProductAdminException.class)
    @Override
    public void updateProduct(long id, Product product) throws ProductAdminException {
        if (this.baseMapper.selectById(id) == null) { // 如果产品不存在
            throw new ProductAdminException("产品" + id + "不存在"); // 抛出异常
        }

        try {
            this.baseMapper.updateById(product); // 更新产品数据
        } catch (Exception e) {
            throw new ProductAdminException("修改产品失败：" + e.getMessage()); // 抛出异常
        }
    }

    // 实现接口中的方法，用于更新产品的供应商信息
    @Transactional(rollbackFor = ProductAdminException.class)
    @Override
    public void updateProductSuppliers(long id, List<Supplier> suppliers) throws ProductAdminException {
        if (this.baseMapper.selectById(id) == null) { // 如果产品不存在
            throw new ProductAdminException("产品" + id + "不存在"); // 抛出异常
        }

        try {
            this.baseMapper.deleteSuppliersOfProduct(id); // 删除原有供应商信息
            for (Supplier supplier : suppliers) { // 遍历新的供应商列表
                this.baseMapper.insertProductSupplier(id, supplier.getId()); // 插入新的供应商信息
            }
        } catch (Exception e) {
            throw new ProductAdminException("修改产品失败：" + e.getMessage()); // 抛出异常
        }
    }

    // 实现接口中的方法，用于删除产品
    @Transactional(rollbackFor = ProductAdminException.class)
    @Override
    public void deleteProduct(long id) throws ProductAdminException {
        try {
            this.baseMapper.deleteSuppliersOfProduct(id); // 删除产品的供应商信息
            this.baseMapper.deleteById(id); // 删除产品数据
        } catch (Exception e) {
            throw new ProductAdminException("删除产品失败：" + e.getMessage()); // 抛出异常
        }
    }
}
